package com.jt.service;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.jt.mapper.UserMapper;
import com.jt.pojo.User;
import com.jt.vo.PageResult;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.DigestUtils;
import org.springframework.util.StringUtils;

import java.util.List;
import java.util.UUID;

/**
 * @author 刘昱江
 * 时间 2021/5/11
 */
@Service
public class UserServiceImpl implements UserService{

    @Autowired
    private UserMapper userMapper;

    @Override
    public List<User> findAll() {
        return userMapper.selectList(null);
    }

    /**
     * 将明文转化为密文MD5加密
     * @param user
     * @return
     * 通过username和password查询数据库
     * 有数据：用户名和密码正确 返回UUID token
     * 无数据：用户名或密码错误，返回null
     */
    @Override
    public String login(User user) {
        String password = user.getPassword();
//       md5hash 相对于md5更加安全
        String md5Pass =DigestUtils.md5DigestAsHex(password.getBytes());
        user.setPassword(md5Pass);
//        根据其中不为null的数据当做where条件
//        sql:select * from user where u=#{u} and p =#{p}
        QueryWrapper<User> queryWrapper =new QueryWrapper<>(user);
       User userDB= userMapper.selectOne(queryWrapper);
       if(userDB==null) {
           return null;
       }
       String token = UUID.randomUUID().toString().replace("-", "");
        return token;
    }

    /**
     * Sql:select * from user limit(数据的起始位置0，查询的条数n)
     * 查询第1页 每页20条
     * select * from user limit (0,20)
     * 查询第2页 每页20条
     * select * from user limit (20,20)
     * 查询第n页 每页k条
     * Select *from user limit ((n-1)k,k)
     * 带条件的查询：先查条件，再分页
     * select * from user where name like "%#{query}%" limit (n-1)20,20
     * 分页查询的说明
     *      userMapper.selectPage(分页对象，查询条件）
     */
    @Override
    public PageResult getUserList(PageResult pageResult) {
//      1.定义分页对象
        IPage page = new Page (pageResult.getPageNum(),pageResult.getPageSize());
//      2.构建查询的条件构造器
        QueryWrapper <User> queryWrapper=new QueryWrapper<>();
        boolean flag = StringUtils.hasLength(pageResult.getQuery());
//        根据判断条件决定是否拼接where条件
        queryWrapper.like(flag,"username", pageResult.getQuery());
//      MP提供的分页查询方法，返回值Page分页对象,其中包含分页的数据结果信息
       page =userMapper.selectPage(page,queryWrapper);
       long total = page.getTotal();
       List<User> list = page.getRecords();//MP帮助实现了分页查询
        return pageResult.setRows(list).setTotal(total);
    }
//user:{id:xxx,status:true/false}
    @Override
    @Transactional
    public void updateStatus(User user) {
        userMapper.updateById(user);
    }

    @Override
    @Transactional
    public void deleteUserById(Integer id) {
        userMapper.deleteById(id);
    }

    /**
     * 1.要求将密码  加密处理
     * 2.入库/更新的时间（框架帮助完成）
     * 3:事务：操作成功 数据库提交事务，操作失败，事务回滚
     * 事务的控制说明：rollbackFor：遇到某种异常时进行回滚
     * rollbackFor = Exception.class;所有异常都回滚
     * noRollbackFor = 遇到某种异常，不回滚事务
     * 特殊环境下使用，一般条件下采用默认行为
     * @param user
     */
    @Override
    @Transactional//只对运行期异常有效果1.运行期异常 2.编译异常(检查异常)
    public void addUser(User user) {
        String md5Pass = DigestUtils.md5DigestAsHex(user.getPassword().getBytes());
        user.setPassword(md5Pass);
        user.setStatus(true);
        userMapper.insert(user);
    }

    @Override
    public User getUserById(Integer id) {

        return userMapper.selectById(id);
    }
//sql:update user set phone,email where id = ?
    @Override
    @Transactional
    public void updateUser(User user) {
        userMapper.updateById(user);
    }
}
